package com.j180.spring_data_jpa_2demo.bean.one2one;

import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;

import javax.persistence.*;
import java.io.Serializable;

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name="t_person")
public class Person implements Serializable {
    /*
      Auto: hibernate会根据数据库自动使用(默认的)
     IDENTITY: mysql专用  自动增长  (****)
     SEQUENCE: oracle专用  序列号
     Table: 使用一个专用的表来保存id
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @Column(name= "name",unique = true,length =50,nullable = false)
    private String name;

    @Column(name= "gender",length =3,nullable = false)
    private String gender;

    /**
     * cascade: 级联操作：一张表的操作会引起另一张的数据
     * CascadeType.ALL：增删改所有级联 (****)
     * CascadeType.PERSIST：级联增加操作
     * CascadeType.MERGE：级联更新操作
     * CascadeType.REMOVE：级联删除操作
     * CascadeType.REFRESH：级联刷新操作
     * CascadeType.DETACH：级联脱管/游离操作
     */
    /** fetch：关联对象的数据的加载方式
     *  fetch = FetchType.EAGER   立即加载
     *  fetch = FetchType.LAZY    懒加载  （作用：增加效率）
     *  mappedBy: 表与表的关系由谁来位置（一般都是有外键的一方来维护）
     *
     */
    @OneToOne(targetEntity=Card.class,
              fetch = FetchType.LAZY,
              cascade = CascadeType.ALL
    )
    @JoinColumn(name = "cardId")  //表中的外键
    private Card card;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", card=" + card +
                '}';
    }
}
